home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 8
/
FM Towns Free Software Collection 8.iso
/
t_os
/
roman
/
roman3.bas
< prev
next >
Wrap
BASIC Source File
|
1994-06-01
|
11KB
|
339 lines
10 '
20 '====ローマ字仮名変換プログラム by 金子卓哉=====
30 ' (FOR FUJITSU FM TOWNS F-BASIC386 V2.1)
40 '
50 '内容
60 ' 指定されたファイルを読み込み、
70 ' 半角アルファベット部を仮名変換して、画面に表示する。
80 ' 半角アルファベットでない部分はそのまま表示する。
90 ' アルファベットの大文字小文字の区別はしない。
100 ' 入力ファイル名は、プログラム内で文字列 INPDEVICE$ に設定する。
110 '
120 '
130 '変数一覧
140 '
150 ' I, J 汎用変数
160 ' TRUE = -1
170 ' FALSE = 0 真偽判定用 定数
180 '
190 ' INPDEVICE$ 入力ファイル指定用 文字列変数
200 '
210 ' S$ 一行読み込み用 文字列変数
220 ' C$ 一文字読み込み用 文字列変数
230 '
240 ' CH キャラクタコード
250 '
260 ' N1 現在処理中の文字番号
270 ' N2 一つ前の文字番号
280 ' N3 二つ前の文字番号
290 '
300 ' N1 : A=0 から 「文字コードデータ」部の順に割り当てる
310 ' N2, N3 には、 N1 が順送りされていく。
320 '
330 ' ST 現在の状態を表す変数
340 '
350 ' ST = 0 変換直後。 N1 のみ考慮すればよい。
360 ' ST = 1 一文字保留中。 N2 と N1 を考慮する。
370 ' ST = 2 二文字保留中。 N3 と N2 と N1 を考慮する。
380 '
390 ' ATTR(Nn) 文字属性用 配列 Nn:文字番号
400 '
410 ' ATTR(Nn) = 0 母音
420 ' 1 子音
430 ' 2 その他
440 '
450 ' CODE(Nn) 文字コード用 配列 Nn:文字番号
460 '
470 ' 規定の文字コードを表す。
480 '
490 ' KANA$(Cs,Cb) 変換表用 文字列配列
500 ' Cs:子音の文字コード, Cb:母音の文字コード
510 ' 子音と母音の文字コードに対応する、 仮名文字列
520 '
530 '
540 '----データ部----
550 '
560 *ZOKUSEI' 文字属性データ(0:母音 1:子音 2:特例 3:その他)
570 ' A B C D E F G H I J K L M N O P ' 文字番号 0~15
580 DATA 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1 ' 文字属性
590 ' Q R S T U V W X Y Z ' CH SH TS LY 他 ' 文字番号16~31
600 DATA 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3 ' 文字属性
610 '
620 *MOJICODE' 文字コードデータ
630 ' A B C D E F G H I J K L M N O P ' 文字番号 0~15
640 DATA 0,12,23,11, 3,16, 9, 5, 1,14, 1,21, 6, 4, 4,13 ' 文字コード
650 ' Q R S T U V W X Y Z ' CH SH TS LY 他 ' 文字番号16~31
660 DATA 24, 8, 2, 3, 2,17,15,25, 7,10,26,18,19,20,22,27 ' 文字コード
670 '
680 *HENKANHYOU' 変換表データ(数字は文字コード)
690 ' A I U E O 単独
700 ' 0 1 2 3 4 5
710 DATA ア ,イ ,ウ ,エ ,オ , ' 0 A
720 DATA カ ,キ ,ク ,ケ ,コ ,ク ' 1 K ここから
730 DATA サ ,シ ,ス ,セ ,ソ ,ス ' 2 S
740 DATA タ ,チ ,ツ ,テ ,ト ,ト ' 3 T
750 DATA ナ ,ニ ,ヌ ,ネ ,ノ ,ン ' 4 N
760 DATA ハ ,ヒ ,フ ,ヘ ,ホ ,フ ' 5 H
770 DATA マ ,ミ ,ム ,メ ,モ ,ム ' 6 M
780 DATA ヤ ,イ ,ユ ,イェ ,ヨ ,イ ' 7 Y
790 DATA ラ ,リ ,ル ,レ ,ロ ,ル ' 8 R
800 DATA ガ ,ギ ,グ ,ゲ ,ゴ ,グ ' 9 G
810 DATA ザ ,ジ ,ズ ,ゼ ,ゾ ,ズ '10 Z
820 DATA ダ ,ヂ ,ヅ ,デ ,ド ,ド '11 D
830 DATA バ ,ビ ,ブ ,ブ ,ボ ,ブ '12 B
840 DATA パ ,ピ ,プ ,ペ ,ポ ,プ '13 P
850 DATA ジャ ,ジ ,ジュ ,ジェ ,ジョ ,ジ '14 J ここまでが子音1
860 DATA ワ ,ウィ ,ウ ,ウェ ,ヲ ,ウ '15 W
870 DATA ファ ,フィ ,フ ,フェ ,フォ ,フ '16 F
880 DATA ヴァ ,ヴィ ,ヴ ,ヴェ ,ヴォ ,ヴ '17 V
890 DATA チャ ,チ ,チュ ,チェ ,チョ ,チ '18 CH
900 DATA シャ ,シ ,シュ ,シェ ,ショ ,シュ '19 SH
910 DATA トサ ,トシ ,ツ ,トセ ,トソ ,ツ '20 TS
920 DATA ラ ,リ ,ル ,レ ,ロ ,ル '21 L
930 DATA リャ ,リィ ,リュ ,リェ ,リョ ,リィ '22 LY
940 DATA キャ ,シ ,ク ,セ ,コ ,ク '23 C
950 DATA クァ ,クィ ,ク ,クェ ,クォ ,ク '24 Q
960 DATA グザ ,グジ,クス ,グゼ,クソ ,クス '25 X
970 DATA ャ ,ィ ,ュ ,ェ ,ョ , '26 子音 + Y
980 ' 27 その他
990 '
1000 '----初期設定----
1010 '
1020 SCREEN@ 0 : CLS ' 画面設定
1030 DEFINT A-Z
1040 ON KEY(1) GOSUB *END : ON ERROR GOTO *ERR ' 割り込み処理設定
1050 '
1060 TRUE = -1 : FALSE = 0 ' 真偽判定用定数
1070 '
1080 '配列宣言
1090 ATTRMAX = 31 : CODEMAX = 31 : BOINMAX = 5 : SIINMAX = 26
1100 DIM ATTR(ATTRMAX), CODE(CODEMAX), KANA$(SIINMAX, BOINMAX)
1110 '
1120 '各配列にデータを読み込む
1130 RESTORE *ZOKUSEI
1140 FOR I=0 TO ATTRMAX
1150 READ ATTR(I) '文字属性
1160 NEXT
1170 RESTORE *MOJICODE
1180 FOR I=0 TO CODEMAX
1190 READ CODE(I) '文字コード
1200 NEXT
1210 RESTORE *HENKANHYOU
1220 FOR J=0 TO SIINMAX
1230 FOR I=0 TO BOINMAX
1240 READ KANA$(J, I) '変換表
1250 NEXT
1260 NEXT
1270 '
1280 '----メインプログラム----
1290 '
1300 *START
1310 '
1320 MOUSE 0 ' マウス機能初期化
1330 KEY(1) ON ' 割り込み開始
1340 '
1350 GOSUB *INPUTFILE ' ファイル名入力ルーチンへ
1360 '
1370 OPEN "I", #1, INPDEVICE$ ' ファイルオープン(既存, 入力モード )
1380 '
1390 GOSUB *CAUTION ' 注意表示
1400 '
1410 '以下, ファイルの終わりまで繰り返す
1420 WHILE (EOF(1) = FALSE) AND (INKEY$ = "")
1430 '
1440 LINE INPUT #1, S$ ' 一行読み込み
1450 ST=0
1460 '
1470 '空行でなければ以下実行
1480 IF (KLEN(S$,0) > 0) THEN
1490 '
1500 '以下, 一文字目から一行の終わりまで繰り返す
1510 FOR I=1 TO KLEN(S$,0)
1520 '
1530 C$ = KMID$(S$,I,1) ' I文字目読み込み
1540 CH = ASC(C$) ' キャラクタコードを求める
1550 '
1560 GOSUB *CH_TO_N1 ' 規定の文字番号を求める
1570 '
1580 '状態によって分岐
1590 ON ST+1 GOSUB *HENKAN1, *HENKAN2, *HENKAN3
1600 '
1610 N3 = N2 : N2 = N1 ' 次の文字へ
1620 '
1630 'マウスが押されていたらリリース待ち
1640 WHILE (MOUSE(2,0) = TRUE) : WEND
1650 '
1660 NEXT
1670 '
1680 ENDIF
1690 '
1700 PRINT ' 一行終わったので改行
1710 WEND
1720 '
1730 CLOSE ' ファイルクローズして初めに戻る
1740 COLOR 5 : PRINT : PRINT "変換終了です。"
1750 GOTO *START
1760 '
1770 '
1780 '---以下、 サブルーチン---
1790 '
1800 '一文字目
1810 *HENKAN1
1820 IF (ATTR(N1) = 0) THEN ' 母音の場合
1830 PRINT KANA$(0, CODE(N1)); ' そのまま変換して変換終了
1840 ST = 0
1850 ELSE IF (ATTR(N1) = 1) THEN ' 子音の場合
1860 ST = 1 ' 通常は一文字保留だが
1870 IF (I = KLEN(S$,0)) THEN
1880 PRINT KANA$(CODE(N1), 5); ' 文末の場合のみ出力して変換終了
1890 ST = 0
1900 ENDIF
1910 ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
1920 IF (N1 = 23) THEN ' 「X」の場合は「ー」を出力し
1930 PRINT "ー";
1940 ELSE IF (N1 = 26) THEN ' 「'」の場合はそのまま出力し
1950 PRINT C$;
1960 ENDIF ' 「Q」の場合は何もしないで
1970 ST = 0 ' 変換終了
1980 ELSE ' アルファベットでない文字の場合
1990 PRINT C$; ' そのまま出力して変換終了
2000 ST = 0
2010 ENDIF
2020 RETURN
2030 '
2040 '二文字目(子音 + 二文字目)
2050 *HENKAN2
2060 IF (ATTR(N1) = 0) THEN ' 母音の場合
2070 PRINT KANA$(CODE(N2), CODE(N1)); ' 子音と併せて変換して変換終了
2080 ST = 0
2090 ELSE IF (ATTR(N1) = 1) THEN ' 二文字目も子音の場合
2100 IF (N2 = N1) THEN ' 同じ子音の繰り返しなら
2110 PRINT "ッ"; ' 「ッ」を出力して一文字保留
2120 ST = 1
2130 ELSE IF (N2 = 2) AND (N1 = 7) THEN ' 「C + H」の場合は
2140 N1 = 27 ' 子音を「CH」にして一文字保留
2150 ST = 1
2160 ELSE IF (N2 = 18) AND (N1 = 7) THEN ' 「S + H」の場合は
2170 N1 = 28 ' 子音を「SH」にして一文字保留
2180 ST = 1
2190 ELSE IF (N2 = 19) AND (N1 = 18) THEN ' 「T + S」の場合は
2200 N1 = 29 ' 子音を「TS」にして一文字保留
2210 ST = 1
2220 ELSE IF (N2 = 11) AND (N1 = 24) THEN ' 「L + Y」の場合は
2230 N1 = 30 ' 子音を「LY」にして一文字保留
2240 ST = 1
2250 ELSE ' それ以外の「子音 + 子音」の場合は
2260 ST = 2 ' 通常は二文字保留だが
2270 IF (I = KLEN(S$,0)) THEN ' 文末の場合
2280 PRINT KANA$(CODE(N2), 5);
2290 ST = 0
2300 ENDIF
2310 ENDIF
2320 IF (I = KLEN(S$,0)) THEN
2330 PRINT KANA$(CODE(N1), 5); ' 文末の場合
2340 ST = 0
2350 ENDIF
2360 ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
2370 PRINT KANA$(CODE(N2), 5);
2380 ST = 0 ' 変換終了
2390 ELSE ' アルファベットでない場合
2400 PRINT KANA$(CODE(N2), 5);
2410 PRINT C$; ' そのまま出力して変換終了
2420 ST = 0
2430 ENDIF
2440 RETURN
2450 '
2460 '三文字目(子音 + 子音 + 三文字目)
2470 *HENKAN3
2480 IF (ATTR(N1) = 0) THEN ' 母音の場合
2490 IF ((1 <= CODE(N3)) AND (CODE(N3) <= 14)) AND (N2 = 24) THEN
2500 ' 「子音1 + Y + 母音」の場合 例 KYA -> KI + LYA -> きゃ
2510 PRINT KANA$(CODE(N3), 1) + KANA$(26, CODE(N1));
2520 ELSE ' それ以外の場合
2530 PRINT KANA$(CODE(N3), 5);
2540 PRINT KANA$(CODE(N2), CODE(N1)); ' 「子音 + 母音」を出力して
2550 ENDIF
2560 '変換終了
2570 ST = 0
2580 ELSE IF (ATTR(N1) = 1) THEN ' 子音の場合
2590 PRINT KANA$(CODE(N3), 5); ' 通常は最初の子音は切り捨てて
2600 ST = 2 ' 二文字保留
2610 IF (N2 = N1) THEN ' 同じ子音の繰り返しなら
2620 PRINT "ッ"; ' 「ッ」を出力して一文字保留
2630 ST = 1
2640 ELSE IF (N2 = 2) AND (N1 = 7) THEN ' 「C + H」の場合は
2650 N1 = 27 ' 子音「CH」一文字のみ保留
2660 ST = 1
2670 ELSE IF (N2 = 18) AND (N1 = 7) THEN ' 「S + H」の場合は
2680 N1 = 28 ' 子音「SH」一文字のみ保留
2690 ST = 1
2700 ELSE IF (N2 = 19) AND (N1 = 18) THEN ' 「T + S」の場合は
2710 N1 = 29 ' 子音「TS」一文字のみ保留
2720 ST = 1
2730 ELSE IF (N2 = 11) AND (N1 = 24) THEN ' 「L + Y」の場合は
2740 N1 = 30 ' 子音「LY」一文字のみ保留
2750 ST = 1
2760 ENDIF
2770 IF (I = KLEN(S$,0)) AND (ST = 2) THEN ' 文末の場合は
2780 PRINT KANA$(CODE(N2), 5) + KANA$(CODE(N1), 5);
2790 ST = 0
2800 ELSE IF (I = KLEN(S$,0)) AND (ST = 1) THEN
2810 PRINT KANA$(CODE(N1), 5);
2820 ST = 0
2830 ENDIF
2840 ELSE IF (ATTR(N1) = 2) THEN ' 特例の場合
2850 PRINT KANA$(CODE(N3), 5) + KANA$(CODE(N2), 5);
2860 ST = 0 ' 変換終了
2870 ELSE ' アルファベットでない場合
2880 PRINT KANA$(CODE(N3), 5) + KANA$(CODE(N2), 5);
2890 PRINT C$; ' そのまま出力して変換終了
2900 ST = 0
2910 ENDIF
2920 RETURN
2930 '
2940 'キャラクタコードから、 規定の文字番号を求める
2950 *CH_TO_N1
2960 IF (ASC("A") <= CH) AND (CH <= ASC("Z")) THEN ' 大文字
2970 N1 = CH - ASC("A")
2980 ELSE IF (ASC("a") <= CH) AND (CH <= ASC("z")) THEN ' 小文字
2990 N1 = CH - ASC("a")
3000 ELSE IF (CH = ASC("'")) THEN ' 「'」
3010 N1 = 26
3020 ELSE ' アルファベットでない文字
3030 N1 = 31
3040 ENDIF
3050 RETURN
3060 '
3070 '入力ファイル名指定
3080 *INPUTFILE
3090 PRINT : COLOR 4
3100 PRINT "ローマ字仮名変換プログラム(冗談版) by たくりん"
3110 COLOR 7 : PRINT "マウス左クリック待ちです";
3120 PRINT "([CTRL]+[ESC]→サイドワーク,[PF 1]→終了)。"
3130 PRINT "準備が出来たら左クリックして下さい(カーソルが現れます)。"
3140 PRINT "INPUT FILE ? >";
3150 WHILE (MOUSE(2,0) = FALSE) : WEND
3160 LINE INPUT INPDEVICE$
3170 RETURN
3180 '
3190 '注意表示
3200 *CAUTION
3210 COLOR 5 : PRINT
3220 PRINT "マウスの左ボタンを押している間表示が止まります。";
3230 PRINT "また、何かキーを押すと中断し、最初に戻ります。"
3240 PRINT : COLOR 7
3250 RETURN
3260 '
3270 'エラー時
3280 *ERR
3290 CLOSE : COLOR 2 : PRINT
3300 PRINT "何かエラーが起きました。 エラー番号";ERR;"エラー行";ERL
3310 RESUME *START
3320 '
3330 '終了
3340 *END
3350 CLOSE : MOUSE 5
3360 COLOR 5 : PRINT : PRINT : PRINT "終了します。" : COLOR 7
3370 END
3380 '